package ec.linde.persistencia.entidades.proyectos;

import static javax.persistence.GenerationType.IDENTITY;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import ec.linde.enumeraciones.TipoNegocio;
import ec.linde.persistencia.entidades.ProdCabeceraProforma;
import ec.linde.persistencia.entidades.ProdClientes;
import ec.linde.persistencia.entidades.ProdPersonas;
import ec.linde.persistencia.entidades.ProdSucursales;
import ec.linde.persistencia.entidades.SeadUsuarios;

/**
 * TODO: Agregar descripcion
 * 
 * @FechaCreacion: 29/09/2014
 * @author: Alex Carrillo
 * @FechaModificacion: 29/09/2014
 * @author: Alex Carrillo
 * @version: 1.0
 */
@Entity
@Table(name = "prod_proyecto", uniqueConstraints = @UniqueConstraint(columnNames = { "proy_numero" }), schema = "productividad")
public class Proyecto extends EntidadBase {

	private static final long serialVersionUID = 1L;

	/**
	 * Atributos
	 */
	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "proy_id", unique = true, nullable = false)
	private int idProyecto;

	@Column(name = "proy_numero", nullable = true, length = 20)
	@Size(min = 2, max = 20)
	private String numero;

	// Tomar en cuenta es la proforma o oferta
	@OneToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "capr_id", nullable = false)
	@NotNull
	private ProdCabeceraProforma proforma;

	@Column(name = "proy_nombre", nullable = false, length = 20)
	@Size(min = 2, max = 20)
	@NotNull
	private String nombre;

	@Column(name = "proy_fecha", nullable = false)
	@Temporal(TemporalType.DATE)
	@NotNull
	private Date fecha;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "clie_id", nullable = false)
	@NotNull
	private ProdClientes cliente;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "cocl_id", nullable = false)
	@NotNull
	private ContactoCliente contactoCliente;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "cntr_id", nullable = false)
	@NotNull
	private Contratista contratista;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "coct_id")
	@NotNull
	private ContactoContratista contactoContratista;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "usua_id")
	@NotNull
	private SeadUsuarios usuario;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "sucu_id")
	@NotNull
	private ProdSucursales sucursal;

	@Enumerated(EnumType.STRING)
	@Column(name = "proy_tipo_negocio")
	@NotNull
	private TipoNegocio tipoNegocio;

	@Column(name = "proy_codigo_dki", nullable = false, length = 20)
	@Size(max = 20)
	@NotNull
	private String codigoDKI;

	@Column(name = "proy_alcance", nullable = false, length = 200)
	@Size(max = 200)
	@NotNull
	private String alcance;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "pers_id", nullable = false)
	@NotNull
	private ProdPersonas persona;

	@Column(name = "proy_direccion_obra", nullable = false, length = 200)
	@Size(max = 200)
	@NotNull
	private String direccionObra;

	@Column(name = "proy_orden_trabajo", nullable = false, length = 200)
	@Size(max = 20)
	@NotNull
	private String ordenTrabajo;

	@Column(name = "proy_orden_trabajo_adicio", nullable = true, length = 200)
	@Size(max = 200)
	private String ordenTrabajoAdicional;

	@Column(name = "proy_contrato", nullable = false, length = 20)
	@Size(max = 20)
	@NotNull
	private String contrato;

	@Column(name = "proy_plano", nullable = false, length = 20)
	@Size(max = 20)
	@NotNull
	private String plano;

	@Column(name = "proy_distancia", nullable = false)
	@Min(0)
	@NotNull
	private BigDecimal distancia = BigDecimal.ZERO;

	@Column(name = "proy_descripcion", nullable = true, length = 200)
	@Size(max = 200)
	private String descripcion;

	@OneToMany(mappedBy = "proyecto", fetch = FetchType.LAZY)
	public List<ProyectoContratistaSecundario> listaProyectoContratistaSecundario = new ArrayList<ProyectoContratistaSecundario>();

	@OneToMany(mappedBy = "proyecto", fetch = FetchType.LAZY)
	public List<ProyectoProformaSecundaria> listaProformaSecundarias = new ArrayList<ProyectoProformaSecundaria>();

	/**
	 * Transients
	 */

	/**
	 * Constructores
	 */

	/**
	 * Metodos GET y SET
	 */

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.asinfo.as2.entities.ProyectoBase#getId()
	 */
	@Override
	public int getId() {
		return idProyecto;
	}

	/**
	 * Get del atributo idProyecto
	 * 
	 * @return el valor del atributo idProyecto
	 */
	public int getIdProyecto() {
		return idProyecto;
	}

	/**
	 * Set del atributo idProyecto
	 * 
	 * @param idProyecto
	 *            valor para asignar al atributo idProyecto
	 */
	public void setIdProyecto(int idProyecto) {
		this.idProyecto = idProyecto;
	}

	/**
	 * Get del atributo numero
	 * 
	 * @return el valor del atributo numero
	 */
	public String getNumero() {
		return numero;
	}

	/**
	 * Set del atributo numero
	 * 
	 * @param numero
	 *            valor para asignar al atributo numero
	 */
	public void setNumero(String numero) {
		this.numero = numero;
	}

	/**
	 * Get del atributo proforma
	 * 
	 * @return el valor del atributo proforma
	 */
	public ProdCabeceraProforma getProforma() {
		return proforma;
	}

	/**
	 * Set del atributo proforma
	 * 
	 * @param proforma
	 *            valor para asignar al atributo proforma
	 */
	public void setProforma(ProdCabeceraProforma proforma) {
		this.proforma = proforma;
	}

	/**
	 * Get del atributo nombre
	 * 
	 * @return el valor del atributo nombre
	 */
	public String getNombre() {
		return nombre;
	}

	/**
	 * Set del atributo nombre
	 * 
	 * @param nombre
	 *            valor para asignar al atributo nombre
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	/**
	 * Get del atributo cliente
	 * 
	 * @return el valor del atributo cliente
	 */
	public ProdClientes getCliente() {
		return cliente;
	}

	/**
	 * Set del atributo cliente
	 * 
	 * @param cliente
	 *            valor para asignar al atributo cliente
	 */
	public void setCliente(ProdClientes cliente) {
		this.cliente = cliente;
	}

	/**
	 * Get del atributo contactoCliente
	 * 
	 * @return el valor del atributo contactoCliente
	 */
	public ContactoCliente getContactoCliente() {
		return contactoCliente;
	}

	/**
	 * Set del atributo contactoCliente
	 * 
	 * @param contactoCliente
	 *            valor para asignar al atributo contactoCliente
	 */
	public void setContactoCliente(ContactoCliente contactoCliente) {
		this.contactoCliente = contactoCliente;
	}

	/**
	 * Get del atributo contratista
	 * 
	 * @return el valor del atributo contratista
	 */
	public Contratista getContratista() {
		return contratista;
	}

	/**
	 * Set del atributo contratista
	 * 
	 * @param contratista
	 *            valor para asignar al atributo contratista
	 */
	public void setContratista(Contratista contratista) {
		this.contratista = contratista;
	}

	/**
	 * Get del atributo contactoContratista
	 * 
	 * @return el valor del atributo contactoContratista
	 */
	public ContactoContratista getContactoContratista() {
		return contactoContratista;
	}

	/**
	 * Set del atributo contactoContratista
	 * 
	 * @param contactoContratista
	 *            valor para asignar al atributo contactoContratista
	 */
	public void setContactoContratista(ContactoContratista contactoContratista) {
		this.contactoContratista = contactoContratista;
	}

	/**
	 * Get del atributo usuario
	 * 
	 * @return el valor del atributo usuario
	 */
	public SeadUsuarios getUsuario() {
		return usuario;
	}

	/**
	 * Set del atributo usuario
	 * 
	 * @param usuario
	 *            valor para asignar al atributo usuario
	 */
	public void setUsuario(SeadUsuarios usuario) {
		this.usuario = usuario;
	}

	/**
	 * Get del atributo sucursal
	 * 
	 * @return el valor del atributo sucursal
	 */
	public ProdSucursales getSucursal() {
		return sucursal;
	}

	/**
	 * Set del atributo sucursal
	 * 
	 * @param sucursal
	 *            valor para asignar al atributo sucursal
	 */
	public void setSucursal(ProdSucursales sucursal) {
		this.sucursal = sucursal;
	}

	/**
	 * Get del atributo tipoNegocio
	 * 
	 * @return el valor del atributo tipoNegocio
	 */
	public TipoNegocio getTipoNegocio() {
		return tipoNegocio;
	}

	/**
	 * Set del atributo tipoNegocio
	 * 
	 * @param tipoNegocio
	 *            valor para asignar al atributo tipoNegocio
	 */
	public void setTipoNegocio(TipoNegocio tipoNegocio) {
		this.tipoNegocio = tipoNegocio;
	}

	/**
	 * Get del atributo codigoDKI
	 * 
	 * @return el valor del atributo codigoDKI
	 */
	public String getCodigoDKI() {
		return codigoDKI;
	}

	/**
	 * Set del atributo codigoDKI
	 * 
	 * @param codigoDKI
	 *            valor para asignar al atributo codigoDKI
	 */
	public void setCodigoDKI(String codigoDKI) {
		this.codigoDKI = codigoDKI;
	}

	/**
	 * Get del atributo alcance
	 * 
	 * @return el valor del atributo alcance
	 */
	public String getAlcance() {
		return alcance;
	}

	/**
	 * Set del atributo alcance
	 * 
	 * @param alcance
	 *            valor para asignar al atributo alcance
	 */
	public void setAlcance(String alcance) {
		this.alcance = alcance;
	}

	/**
	 * Get del atributo persona
	 * 
	 * @return el valor del atributo persona
	 */
	public ProdPersonas getPersona() {
		return persona;
	}

	/**
	 * Set del atributo persona
	 * 
	 * @param persona
	 *            valor para asignar al atributo persona
	 */
	public void setPersona(ProdPersonas persona) {
		this.persona = persona;
	}

	/**
	 * Get del atributo direccionObra
	 * 
	 * @return el valor del atributo direccionObra
	 */
	public String getDireccionObra() {
		return direccionObra;
	}

	/**
	 * Set del atributo direccionObra
	 * 
	 * @param direccionObra
	 *            valor para asignar al atributo direccionObra
	 */
	public void setDireccionObra(String direccionObra) {
		this.direccionObra = direccionObra;
	}

	/**
	 * Get del atributo ordenTrabajo
	 * 
	 * @return el valor del atributo ordenTrabajo
	 */
	public String getOrdenTrabajo() {
		return ordenTrabajo;
	}

	/**
	 * Set del atributo ordenTrabajo
	 * 
	 * @param ordenTrabajo
	 *            valor para asignar al atributo ordenTrabajo
	 */
	public void setOrdenTrabajo(String ordenTrabajo) {
		this.ordenTrabajo = ordenTrabajo;
	}

	/**
	 * Get del atributo ordenTrabajoAdicional
	 * 
	 * @return el valor del atributo ordenTrabajoAdicional
	 */
	public String getOrdenTrabajoAdicional() {
		return ordenTrabajoAdicional;
	}

	/**
	 * Set del atributo ordenTrabajoAdicional
	 * 
	 * @param ordenTrabajoAdicional
	 *            valor para asignar al atributo ordenTrabajoAdicional
	 */
	public void setOrdenTrabajoAdicional(String ordenTrabajoAdicional) {
		this.ordenTrabajoAdicional = ordenTrabajoAdicional;
	}

	/**
	 * Get del atributo contrato
	 * 
	 * @return el valor del atributo contrato
	 */
	public String getContrato() {
		return contrato;
	}

	/**
	 * Set del atributo contrato
	 * 
	 * @param contrato
	 *            valor para asignar al atributo contrato
	 */
	public void setContrato(String contrato) {
		this.contrato = contrato;
	}

	/**
	 * Get del atributo plano
	 * 
	 * @return el valor del atributo plano
	 */
	public String getPlano() {
		return plano;
	}

	/**
	 * Set del atributo plano
	 * 
	 * @param plano
	 *            valor para asignar al atributo plano
	 */
	public void setPlano(String plano) {
		this.plano = plano;
	}

	/**
	 * Get del atributo distancia
	 * 
	 * @return el valor del atributo distancia
	 */
	public BigDecimal getDistancia() {
		return distancia;
	}

	/**
	 * Set del atributo distancia
	 * 
	 * @param distancia
	 *            valor para asignar al atributo distancia
	 */
	public void setDistancia(BigDecimal distancia) {
		this.distancia = distancia;
	}

	/**
	 * Get del atributo descripcion
	 * 
	 * @return el valor del atributo descripcion
	 */
	public String getDescripcion() {
		return descripcion;
	}

	/**
	 * Set del atributo descripcion
	 * 
	 * @param descripcion
	 *            valor para asignar al atributo descripcion
	 */
	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	/**
	 * Get del atributo listaProyectoContratistaSecundario
	 * 
	 * @return el valor del atributo listaProyectoContratistaSecundario
	 */
	public List<ProyectoContratistaSecundario> getListaProyectoContratistaSecundario() {
		return listaProyectoContratistaSecundario;
	}

	/**
	 * Set del atributo listaProyectoContratistaSecundario
	 * 
	 * @param listaProyectoContratistaSecundario
	 *            valor para asignar al atributo listaProyectoContratistaSecundario
	 */
	public void setListaProyectoContratistaSecundario(List<ProyectoContratistaSecundario> listaProyectoContratistaSecundario) {
		this.listaProyectoContratistaSecundario = listaProyectoContratistaSecundario;
	}

	/**
	 * Get del atributo listaProformaSecundarias
	 * 
	 * @return el valor del atributo listaProformaSecundarias
	 */
	public List<ProyectoProformaSecundaria> getListaProformaSecundarias() {
		return listaProformaSecundarias;
	}

	/**
	 * Set del atributo listaProformaSecundarias
	 * 
	 * @param listaProformaSecundarias
	 *            valor para asignar al atributo listaProformaSecundarias
	 */
	public void setListaProformaSecundarias(List<ProyectoProformaSecundaria> listaProformaSecundarias) {
		this.listaProformaSecundarias = listaProformaSecundarias;
	}

	/**
	 * Get del atributo fecha
	 * 
	 * @return el valor del atributo fecha
	 */
	public Date getFecha() {
		return fecha;
	}

	/**
	 * Set del atributo fecha
	 * 
	 * @param fecha
	 *            valor para asignar al atributo fecha
	 */
	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}

}
